package com.zjff.mobiletwo.service.impl;

import com.zjff.mobiletwo.dao.PcartDao;
import com.zjff.mobiletwo.dao.ProductDao;
import com.zjff.mobiletwo.entity.PcartEntity;
import com.zjff.mobiletwo.entity.ProductEntity;
import com.zjff.mobiletwo.entity.ResultEntity;
import com.zjff.mobiletwo.service.IcartService;
import com.zjff.mobiletwo.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class CartServiceImpl implements IcartService {
    /**购物车的业务层依赖于购物车的持久层以及商品的持久层*/
    @Autowired
    private PcartDao pcartDao;
    @Autowired
    private ProductDao productDao;
    /**
     * 将商品添加到购物车
     * @param uid      当前登录用户的id
     * @param pid      商品的id
     * @param amount   增加的数量
     * @param username 当前登录的用户名
     * @return
     */
    @Override
    public String addToCart(Integer uid, Integer pid, Integer amount, String username) {
        //查询当前要添加的购物车在表中是否已存在
        PcartEntity result = pcartDao.findByUidAndPid(uid,pid);
        Date date = new Date();
        if (result  == null){//表示这个商品从来没有被添加到购物车，进行新增
            //创建一个cart对象
            PcartEntity cart =new PcartEntity();
            //补全数据：参数传递的数据
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);
            //价格：来自于商品中的数据
            ProductEntity product = productDao.getProductById(pid);
            cart.setName(product.getName());
            cart.setTitle(product.getTitle());
            cart.setBrand(product.getBrand());
            cart.setPic(product.getPic());
            cart.setPrice(product.getPrice());
            //补全日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);
            //执行数据的插入操作
            Integer rows =  pcartDao.insert(cart);
            if (rows != 1){
                return ResultEntity.Fail(-10007,"添加失败!");
            }else {
                return ResultEntity.Success(null,pcartDao.findByUidAndPid(uid, pid),0,"添加成功!");
            }
        }else {//表示这个商品在购物车中已存在，进行修改num值
            Integer num = result.getNum() + amount;
            Integer rows = pcartDao.updateNumByCid(
                    result.getCid(),
                    num,
                    username,
                    date);
            if (rows != 1){
                return ResultEntity.Fail(-10007,"更新失败!");
            }else {
                return ResultEntity.Success(null,pcartDao.findByUidAndPid(uid, pid),0,"更新成功!");
            }
        }
    }
    /**
     * 修改购物车中商品数量
     * @param cid 购物车商品id
     * @param amount 修改的数量
     * @param uid 当前登入的用户id
     * @param username 当前登入的用户名
     * @return
     */
    @Override
    public String updateNumByCid(Integer cid, Integer amount, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        PcartEntity result = pcartDao.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            return ResultEntity.Fail(-10007,"购物车数据不存在!");
        }
        // 判断查询结果中的uid与参数uid是否不一致
        if (result.getUid() != uid) {
            // 是：抛出AccessDeniedException
            return ResultEntity.Fail(-10007,"与登入的用户不一致非法访问!");
        }
        Integer num = amount;
        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = pcartDao.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            return ResultEntity.Fail(-10007,"修改商品数量时出现未知错误，请联系系统管理员!");
        }
        // 返回新的数量
        return ResultEntity.Success(null,pcartDao.findByCid(cid),0,"修改成功!");
    }
    /**
     * 根据用户id和商品id删除购物车中的商品
     * @param pid 商品id
     * @param uid 用户id
     * @param username 用户名
     * @return
     */
    @Override
    public String deleteByUidAndPid(Integer uid, Integer pid, String username) {
        PcartEntity result = pcartDao.findByUidAndPid(uid, pid);
        if (result == null) {
            // 是：抛出CartNotFoundException
            return ResultEntity.Fail(-10007,"购物车数据不存在!");
        }
        if (result.getUid() != uid) {
            // 是：抛出AccessDeniedException
            return ResultEntity.Fail(-10007,"与登入的用户不一致非法访问!");
        }
        return ResultEntity.Success(null,pcartDao.deleteByUidAndPid(uid, pid),0,"修改成功!");
    }
    /**
     * 根据用户id和商品id查询某用户的购物车数据
     * @param pid 商品id
     * @param uid 用户id
     * @param username 用户名
     * @return
     */
    @Override
    public String findByUidAndPid(Integer uid, Integer pid, String username) {
        PcartEntity result = pcartDao.findByUidAndPid(uid, pid);
        if (result == null) {
            // 是：抛出CartNotFoundException
            return ResultEntity.Fail(-10007,"购物车数据不存在!");
        }
        if (result.getUid() != uid) {
            // 是：抛出AccessDeniedException
            return ResultEntity.Fail(-10007,"与登入的用户不一致非法访问!");
        }
        return ResultEntity.Success(null,pcartDao.findByUidAndPid(uid, pid),0,"修改成功!");
    }

    /**
     * 查询某用户的购物车数据
     * @param uid 用户id
     * @return 该用户的购物车数据的列表
     */
    @Override
    public String getVOByUid(Integer uid) {
        return ResultEntity.Success(null,pcartDao.findVOByUid(uid),0,"获取成功!");
    }

    /**
     * 增加购物车商品数量
     * @param cid 购物车数量的id
     * @param amount 想要增加的数量
     * @param uid 当前登录的用户的id
     * @param username 当前登录的用户名
     * @return data
     */
    @Override
    public String addNum(Integer cid,Integer amount, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        PcartEntity result = pcartDao.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            return ResultEntity.Fail(-10007,"购物车数据不存在!");
        }
        // 判断查询结果中的uid与参数uid是否不一致
        if (result.getUid() != uid) {
            // 是：抛出AccessDeniedException
            return ResultEntity.Fail(-10007,"与登入的用户不一致非法访问!");
        }
        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加amount得到新的数量num
        Integer num = result.getNum() + amount;
        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = pcartDao.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            return ResultEntity.Fail(-10007,"修改商品数量时出现未知错误，请联系系统管理员!");
        }
        // 返回新的数量
        return ResultEntity.Success(null,pcartDao.findByCid(cid),0,"修改成功!");
    }

    /**
     * 根据若干个购物车数据id查询详情的列表
     *
     * @param uid  当前登录的用户的id
     * @param cids 若干个购物车数据id
     * @return
     */
    @Override
    public String getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = pcartDao.findVOByCids(cids);
        /**
         for (CartVO cart : list) {
         if (!cart.getUid().equals(uid)) {
         list.remove(cart);
         }
         }
         */
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return ResultEntity.Success(null,list,0,"获取成功!");
    }

    @Override
    public List<CartVO> getVOByCid(Integer uid, Integer[] cids) {
        List<CartVO> list = pcartDao.findVOByCids(cids);
        /**
         for (CartVO cart : list) {
         if (!cart.getUid().equals(uid)) {
         list.remove(cart);
         }
         }
         */
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return list;
    }

    @Override
    public String deleteByCids(Integer uid, Integer[] cids) {
        // 调用findVOByCids(cids)根据参数cid查询购物车数据
        List<CartVO> list = pcartDao.findVOByCids(cids);
        if (list == null) {
            // 是：抛出CartNotFoundException
            return ResultEntity.Fail(-10007,"购物车数据不存在!");
        }
        // 判断查询结果中的uid与参数uid是否不一致
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                return ResultEntity.Fail(-10007,"与登入的用户不一致非法访问!");
            }
        }
        return ResultEntity.Success(null,pcartDao.deleteByCids(cids),0,"删除成功!");
    }
}
